﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace TD.bom
{
    /// <summary>
    /// Template d'une arme, i.e. ensemble d'éléments permettant de créer une arme
    /// </summary>
    public class ProjectileTemplate : TemplateBase
    {
        #region Propriétés

        /// <summary>
        /// Nb de points de dégât qu'inflige l'arme
        /// </summary>
        public int Damage  { get; private set; }

        /// <summary>
        /// Rayon en pixel de la zone d'effet (0 = pas de zone d'effet)
        /// </summary>
        public int DamageRadius { get; private set; }

        #endregion

        /// <summary>
        /// Obtient un template de tour
        /// </summary>
        /// <param name="p_templateName">Nom du template</param>
        /// <returns>Instance de ProjectileTemplate si trouvé, null sinon</returns>
        public new static ProjectileTemplate Get(string p_templateName)
        {
            // On regarde d'abord si le template existe en cache
            ProjectileTemplate l_template = (ProjectileTemplate)TemplateBase.Get(p_templateName);
            if (l_template != null)
            {
                // Si oui, on le renvoie
                return l_template;
            }

            // Sinon, il faut le charger
            l_template = Load(p_templateName);
            if (l_template != null)
            {
                // Et le mettre en cache pour la prochaine fois
                m_cache.Add(p_templateName, l_template);
            }

            return l_template;
        }

        /// <summary>
        /// Charge le template ayant le nom spécifié
        /// </summary>
        /// <param name="p_templateName">Nom du template à charger</param>
        /// <returns>Instance de ProjectileTemplate si trouvé, null sinon</returns>
        protected static ProjectileTemplate Load(string p_templateName)
        {
            // TODO : implémenter un chargement à partir d'un entrepôt quelconque
            // serveur (par service web), ressources...
            ProjectileTemplate l_template = new ProjectileTemplate();

            switch (p_templateName)
            {
                case "weapon/1":
                    {
                        l_template.Damage = 5;
                        l_template.DamageRadius = 0;
                        break;
                    }

                case "weapon/2":
                    {
                        l_template.Damage = 1;
                        l_template.DamageRadius = 20;
                        break;
                    }

                default:
                    {
                        throw new ArgumentOutOfRangeException("p_templateName", "Ce template d'arme n'existe pas");
                    }
            }

            return l_template;
        }
    }
}
